Feb 94 Tips
Volume Number: 10
Issue Number: 2
Column Tag: Tips & Tidbits
Tips & Tidbits
By Neil Ticktin, Editor-in-Chief
Note: Source code files accompanying article are located on MacTech CD-ROM or
source code disks.
Tip Of The Month
Playing a sound can be potentially disastrous. Suppose you have an init that plays
a sound when a mail arrives on the network, but at the same time, e.g., HyperCard is
playing, an (asynchronous) sound of its own. Both sounds will be stopped by a freeze
or a crash.
I looked at the code of the _SysBeep trap, and came up with the
‘SafeSound’-procedure. It will only play the sound when it’s safe to do so. If the
routine did not play the sound, it returns false so that you try again after, say, a few
seconds.
/* 1 */
#define ExpandMem 0x02B6
#define WWExists 0x08F2
Boolean SafeSound (Handle snd)
{
asm {
move SR, D0 ; this little piece of code checks if
andi.w #0x0700, D0 ; we can play our sound !
bne @exit ; Took it from code of the
SysBeep-trap!
movea.l ExpandMem, A0
movea.l 0x0110(A0), A0
tst.w 0x0018(A0)
beq @exit
tst.b WWExists
bne @exit
}
SndPlay (NULL, snd, false) ;
return true ; // ok, sound is played
exit:
return false; // sound has not been played
}
- Jan Bruyndonckx
Wave Re search
Belgium
This column is your opportunity to spread the word about little bits of
information that you find out about. These tidbits can be programming related or they
can be user tips that are particularly useful to programmers.
MacTech Magazine will pay $25 for every tip used, and $50 for the Tip of the
Month. Or you can take your award in orders or subscriptions.
To submit a tip, send in a letter to the magazine. E-mail is our preferred
method, but feel free to send something via the US Mail. See page two for all addresses.
If you do send snail mail, enclose a printed copy and a disk copy of the letter so that it
does not have to be retyped.
Changing Popup Fonts
There’s an easy way to change a Popup menu’s font and size. To do that, you could
of course use the new CDEF provided with the Comm Toolbox, but it will not work for
Pre-System 7 users.
An alternative solution is to change system font and size before PopUpMenuSelect
is called, and restore them afterwards. Typical code looks like:
/* 2 */
TYPE
LomemPtrWord=^Integer;
LomemPtrLong=^Longint;
VAR
SysFont, SysSize:Integer;
PopUpResult:Longint;
{-1 means hierarchical menu}
InsertMenu(MyPopUpID, -1);
{ Let's save system font and size }
SysFont := LomemPtrWord($0BA6) ^; {SysFontFam}
SysSize := LomemPtrWord($0BA8) ^; {SysFontSize}
{Modfy to our convenience (Geneva 10)}
LomemPtrWord($0BA6) ^ := Geneva;
LomemPtrWord($0BA8) ^ := 10;
LomemPtrLong($0B4C) ^ := -1;
{ This line insure that system will }
{ load the right font in the cache }
{ for the next job--drawing my Popup }
ResultPopUp := PopUpMenuSelect(MyPopUpHandle, Where.v,
Where.h, DefaultItem);
{ Let's restore system configuration }
LomemPtrWord($0BA6) ^ := SysFont;
LomemPtrWord($0BA8) ^ := SysSize;
LomemPtrLong($0B4C) ^ := -1;
{ Insure that usual system font will be back loaded }
DeleteMenu(MyPopUpID);
{...}
{PopUp Process }
{...}
Remark 1 : If you’re using CheckItem call, be sure that CheckMark character
exists in the font and size you want popup menu to be drawn. If not, use SetItemMark
instead.
Remark 2 : Modifying directly low memory globals is discouraged by Apple.
Future system releases could break this tip. Keep this in mind.
- Laurent Haas
Paris, France
Often Used Field Positions
For data structures accessed via pointers or handles, place the most often used
field in your program in the first place of your data structure declaration.
The Optimal Data Structure Declaration is:
/* 3 */
TYPE
YourDataStructurePtr = ^YourDataStructure;
YourDataStructure = RECORD
often_Used_Field:LongInt;
less_Often_Used_Field:LongInt;
END;
Less Optimal Data Structure Declaration:
TYPE
YourDataStructurePtr = ^YourDataStructure;
YourDataStructure = RECORD
less_Often_Used_Field:LongInt;
often_Used_Field:LongInt;
END;
The compiler will generate 66% faster code for the optimal data structure when
it compiles the next line:
/* 4 */
yourDataStructurePtr^.often_Used_Field:=someValue;
- Marek Hajek
Incline Village, Nevada
It’s in the fine print
The integration of translators in Think C 6.0 has a few rough areas that are not so
obvious, unless you read the fine print in the manual. Unless you never make
assumptions about how a feature works, read on....
First, if you use both the C and C++ translators in the same project, you could
have problems. The C translator allows you to choose whether you want two or four
byte integers. The C++ translator doesn’t give you a choice. Integers are always four
bytes. So if you want your C code to co-exist peacefully with your C++ code, you must
tell the C translator to use four byte integers. Here is the menu/dialog selections you
must make to select four byte integers - “Edit:Options:Think C...:Compiler
Settings:4-byte ints”
Second, the project settings allow you to put strings in the data segment of the
project, or in separate STRS resources. In the “Set Project Type...” option under the
“Project” menu, there is a check box “Separate STRS” that you can use to toggle this
setting. It isn’t obvious, but this toggle only affects the C translator. To toggle the
same setting for the C++ translator you must make the following menu/ dialog
selections: “Edit:Options:Symantec C++:Compiler Settings:Place string literals in
code”.
- Greg Johnson
WordPerfect Corp.
Orem, Utah